home *** CD-ROM | disk | FTP | other *** search
- {$R-}
- unit Delphpcx;
-
- interface
-
- uses
- SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
- Forms, Dialogs, ExtCtrls;
- type
-
- { This record is used instead of TRGBTriple due to a need for reversed fields }
- RGBRecord = record
- RedValue ,
- GreenValue ,
- BlueValue : byte;
- end;
- { These records are used to replace normal palettes with the rgbrecord }
- PPCX256Palette = ^PCX256Palette;
- PPCX16Palette = ^PCX16Palette;
- PCX256Palette = array[ 0 .. 255 ] of RGBRecord;
- PCX16Palette = array[ 0 .. 15 ] of RGBRecord;
- { This is used for large files }
- LongType = record
- case Word of
- 0: (Ptr: pointer);
- 1: (Long: Longint);
- 2: (Lo: word; Hi: word);
- end;
- { This is the header for the PCX file, which is vital to decoding it! }
- PPCXHeader = ^PCXHeader;
- PCXHeader = record
- PCXMagicNumber : byte;
- Version : byte;
- Encoding : byte;
- BitsPerPixel : byte;
- XMinimum ,
- YMinimum : integer;
- XMaximum ,
- YMaximum : integer;
- HorizontalResolution ,
- VerticalResolution : integer;
- EGAColorMap : PCX16Palette;
- Reserved : byte;
- NumberOfPlanes : byte;
- NumberOfBytesPerLine : integer;
- PaletteType : integer;
- end;
- { This is the main PCX decoding object }
- TPCXFileObject = class( TObject )
- ThePCXHeader: PPCXHeader;
- FileHandle: integer;
- ErrorString : String;
- procedure Init( Filename: PChar );
- destructor Destroy; virtual;
- function GetHeaderInfo: pointer;
- procedure LoadPCXBitMap( var TheBitmap : hBitmap; var ThePalette : hPalette);
- end;
-
- MDecoder16 = class( TObject )
- BufferPointer : integer;
- BytesPerLine : integer;
- FileDataBuffer : array[ 0 .. 1023 ] of byte;
- TheHeader : PPCXHeader;
- Height : longint;
- FileHandle : integer;
- Palette : HPalette;
- Width : longint;
- procedure Init( TheFileHandle : integer; Header: PPCXHeader);
- function CreateDIB( var TheDIBPalette : hPalette ): HBitmap; virtual;
- procedure Decode_Row( var ScanLine : pointer ); virtual;
- procedure CreatePCXPalette(BMI: PBitMapInfo);
- procedure Decode(MemoryPointer: THandle; MemorySize: longint; TheBytesPerLine: longint);
- function GetBMI(var Size: word): PBitMapInfo;
- procedure Convert_Row( TheBytesPerLine: longint; TheSource : pointer; var Dest: pointer);
- end;
-
- MDecoder256 = class( TObject )
- BufferPointer : integer;
- BytesPerLine : integer;
- FileDataBuffer : array[ 0 .. 1023 ] of byte;
- TheHeader : PPCXHeader;
- Height : longint;
- FileHandle : integer;
- Palette : HPalette;
- Width : longint;
- procedure Init( TheFileHandle : integer; Header: PPCXHeader);
- function CreateDIB( var TheDIBPalette : hPalette ): HBitmap; virtual;
- procedure Decode_Row( var ScanLine : pointer ); virtual;
- function GetPaletteInfo: pointer;
- procedure CreatePCXPalette( BMI: PBitMapInfo );
- procedure Decode( MemoryPointer: THandle; MemorySize: longint; TheBytesPerLine: longint);
- function GetBMI(var Size: word): PBitMapInfo;
- end;
-
- const
- ErrorString0 = 'OK';
- ErrorString1 = 'Unable to open file';
- ErrorString2 = 'File read error!';
- ErrorString3 = 'Not a PCX file!';
- ErrorString4 = 'Unsupported PCX file format.';
- ErrorString5 = 'Out of Memory';
- ErrorString6 = 'Cannot create 256 color palette';
- ErrorString7 = 'DIB Creation Error';
-
- implementation
-
- procedure AHIncr; far; external 'KERNEL' index 114;
-
- function AlignDouble( Size : longint ) : longint;
- begin
- AlignDouble := (Size + 3) div 4 * 4;
- end;
-
- {---------- TPCXFileObject Methods --------}
-
- procedure TPCXFileObject.Init( Filename : PChar );
- begin
- ErrorString := ErrorString1;
- FileHandle := _LOpen( Filename , of_Read );
- if FileHandle = -1 then exit;
- ErrorString := ErrorString2;
- ThePCXHeader := PPCXHeader( GetHeaderInfo );
- if ThePCXHeader = nil then exit;
- ErrorString := ErrorString3;
- if ThePCXHeader^.PCXMagicNumber <> $0A then exit;
- ErrorString := ErrorString0;
- end;
-
- destructor TPCXFileObject.Destroy;
- begin
- Dispose( ThePCXHeader );
- _lClose( FileHandle );
- inherited Destroy;
- end;
-
- {Get PCX header info for format validation}
- function TPCXFileObject.GetHeaderInfo: pointer;
- var
- TheHeader : PPCXHeader;
- begin
- New( TheHeader );
- _llSeek( FileHandle , 0 , 0);
- if ( _lRead( FileHandle , @TheHeader^ , Sizeof( PCXHeader )) <> Sizeof( PCXHeader )) then
- Dispose( TheHeader );
- GetHeaderInfo := TheHeader;
- end;
-
- {Initialize correct decoder instance, decode and return DIB and Palette handles }
- procedure TPCXFileObject.LoadPCXBitMap( var TheBitmap : HBitmap; var ThePalette : hPalette );
- var
- Decoder16 : MDecoder16;
- Decoder256 : MDecoder256;
- HDIB : HBitmap;
- begin
- ErrorString := ErrorString2;
- if ( ThePCXHeader^.BitsPerPixel = 8 ) and ( ThePCXHeader^.NumberOfPlanes = 1) then
- begin
- Decoder256 := MDecoder256.Create;
- Decoder256.Init( FileHandle , ThePCXHeader );
- ErrorString := ErrorString7;
- HDIB := Decoder256.CreateDIB( ThePalette );
- Decoder256.Free;
- if HDIB = 0 then Exit;
- TheBitmap := HDIB;
- ErrorString := ErrorString0;
- end
- else
- begin
- if ( ThePCXHeader^.BitsPerPixel = 1) and ( ThePCXHeader^.NumberOfPlanes = 4 ) then
- begin
- Decoder16 := MDecoder16.Create;
- Decoder16.Init( FileHandle , ThePCXHeader );
- ErrorString := ErrorString7;
- HDIB := Decoder16.CreateDIB( ThePalette );
- Decoder16.Free;
- if HDIB = 0 then Exit;
- TheBitmap := HDIB;
- ErrorString := ErrorString0;
- end
- else
- begin
- ErrorString := ErrorString3;
- Exit;
- end;
- end;
- end;
-
- {---------- MDecoder Methods --------}
-
- procedure MDecoder16.Init( TheFileHandle : integer; Header : PPCXHeader);
- begin
- FileHandle := TheFileHandle;
- TheHeader := Header;
- _llseek( FileHandle , 128 , 0 );
- Palette := 0;
- BufferPointer := 0;
- BytesPerLine := TheHeader^.NumberOfBytesPerLine;
- Width := longint( TheHeader^.XMaximum ) - longint( TheHeader^.XMinimum ) + 1;
- Height := longint( TheHeader^.YMaximum ) - longint( TheHeader^.YMinimum ) + 1;
- end;
-
- procedure MDecoder256.Init( TheFileHandle : integer; Header : PPCXHeader);
- begin
- FileHandle := TheFileHandle;
- TheHeader := Header;
- _llseek( FileHandle , 128 , 0 );
- Palette := 0;
- BufferPointer := 0;
- BytesPerLine := TheHeader^.NumberOfBytesPerLine;
- Width := longint( TheHeader^.XMaximum ) - longint( TheHeader^.XMinimum ) + 1;
- Height := longint( TheHeader^.YMaximum ) - longint( TheHeader^.YMinimum ) + 1;
- end;
-
-
- function MDecoder16.CreateDIB( var TheDIBPalette : hPalette ) : HBitmap;
- var
- BMInfo : PBitMapInfo;
- bmiSize : word;
- DCHandle : HDC;
- DIBBytesPerLine : longint;
- HImage ,
- HImageNew : HBitmap;
- i : integer;
- ImageSize : longint;
- PImage : pointer;
- OldPal : hPalette;
-
- begin
- CreateDIB := 0;
- if ( TheHeader^.BitsPerPixel = 1 ) and ( TheHeader^.NumberOfPlanes = 4 ) then
- DIBBytesPerLine := AlignDouble( longint( Width ) div 2 )
- else DIBBytesPerLine := AlignDouble( BytesPerLine );
- ImageSize := DIBBytesPerLine * Height;
- GlobalCompact( ImageSize );
- HImage := GlobalAlloc( gmem_Moveable or gmem_ZeroInit , ImageSize );
- if HImage = 0 then Exit;
- Decode( HImage , ImageSize , DIBBytesPerLine );
- BMInfo := GetBMI( bmiSize );
- CreatePCXPalette( BMInfo );
- DCHandle := GetDC( 0 );
- PImage := GlobalLock( HImage );
- OldPal := SelectPalette( DCHandle , Palette , false );
- UnRealizeObject( Palette );
- RealizePalette( DCHandle );
- HImageNew := CreateDIBitmap( DCHandle , BMInfo^.bmiHeader , cbm_Init ,
- PImage , BMInfo^ , 0 );
- SelectPalette( DCHandle , OldPal , false );
- ReleaseDC( 0 , DCHandle );
- GlobalUnlock( HImage );
- Globalfree( HImage );
- {FreeMem( BMInfo , bmiSize );}
- TheDIBPalette := Palette;
- CreateDIB := HImageNew;
- end;
-
- function MDecoder256.CreateDIB( var TheDIBPalette : hPalette ) : HBitmap;
- var
- BMInfo : PBitMapInfo;
- bmiSize : word;
- DCHandle : HDC;
- DIBBytesPerLine : longint;
- HImage ,
- HImageNew : HBitmap;
- i : integer;
- ImageSize : longint;
- PImage : pointer;
- OldPal : hPalette;
-
- begin
- CreateDIB := 0;
- if ( TheHeader^.BitsPerPixel = 1 ) and ( TheHeader^.NumberOfPlanes = 4 ) then
- DIBBytesPerLine := AlignDouble( longint( Width ) div 2 )
- else DIBBytesPerLine := AlignDouble( BytesPerLine );
- ImageSize := DIBBytesPerLine * Height;
- GlobalCompact( ImageSize );
- HImage := GlobalAlloc( gmem_Moveable or gmem_ZeroInit , ImageSize );
- if HImage = 0 then Exit;
- Decode( HImage , ImageSize , DIBBytesPerLine );
- BMInfo := GetBMI( bmiSize );
- CreatePCXPalette( BMInfo );
- DCHandle := GetDC( 0 );
- PImage := GlobalLock( HImage );
- OldPal := SelectPalette( DCHandle , Palette , false );
- UnRealizeObject( Palette );
- RealizePalette( DCHandle );
- HImageNew := CreateDIBitmap( DCHandle , BMInfo^.bmiHeader , cbm_Init ,
- PImage , BMInfo^ , 0 );
- SelectPalette( DCHandle , OldPal , false );
- ReleaseDC( 0 , DCHandle );
- GlobalUnlock( HImage );
- Globalfree( HImage );
- {FreeMem( BMInfo , bmiSize );}
- TheDIBPalette := Palette;
- CreateDIB := HImageNew;
- end;
-
- { Decode an entire scanline into S regardless of image type }
- procedure MDecoder16.Decode_Row(var ScanLine : pointer);
- var
- i ,
- ByteCount ,
- Repeats ,
- RunLength ,
- Plane ,
- NoRead : integer;
- BlueValue : byte;
- SAddr : LongType;
- StartOfs : longint;
- NumRead : integer;
- begin
- SAddr.Ptr := ScanLine;
- StartOfs := SAddr.Lo;
- ByteCount := 0;
- RunLength := TheHeader^.NumberOfBytesPerLine * TheHeader^.NumberOfPlanes;
- if BufferPointer = 0 then
- NumRead := _lread( FileHandle , @FileDataBuffer , Sizeof( FileDataBuffer ));
- while ( ByteCount < RunLength ) do
- begin
- if BufferPointer = 1024 then
- begin
- NumRead := _lread( FileHandle , @FileDataBuffer , Sizeof( FileDataBuffer ));
- BufferPointer := 0;
- end;
- BlueValue := FileDataBuffer[ BufferPointer ];
- BufferPointer := BufferPointer + 1;
- if ( BlueValue >= 192 ) then
- begin
- Repeats := BlueValue - 192;
- if BufferPointer = 1024 then
- begin
- NumRead := _lread( FileHandle , @FileDataBuffer , Sizeof( FileDataBuffer ));
- BufferPointer := 0;
- end;
- BlueValue := FileDataBuffer[ BufferPointer ];
- BufferPointer := BufferPointer + 1;
- for i := 1 to Repeats do
- begin
- Mem[ SAddr.Hi:SAddr.Lo ] := BlueValue;
- ByteCount := ByteCount + 1;
- SAddr.Lo := StartOfs + ByteCount;
- end;
- end
- else
- begin
- Mem[ SAddr.Hi:SAddr.Lo ] := BlueValue;
- ByteCount := ByteCount + 1;
- SAddr.Lo := StartOfs + ByteCount;
- end;
- end;
- end;
- { Decode an entire scanline into S regardless of image type }
- procedure MDecoder256.Decode_Row(var ScanLine : pointer);
- var
- i ,
- ByteCount ,
- Repeats ,
- RunLength ,
- Plane ,
- NoRead : integer;
- BlueValue : byte;
- SAddr : LongType;
- StartOfs : longint;
- NumRead : integer;
- begin
- SAddr.Ptr := ScanLine;
- StartOfs := SAddr.Lo;
- ByteCount := 0;
- RunLength := TheHeader^.NumberOfBytesPerLine * TheHeader^.NumberOfPlanes;
- if BufferPointer = 0 then
- NumRead := _lread( FileHandle , @FileDataBuffer , Sizeof( FileDataBuffer ));
- while ( ByteCount < RunLength ) do
- begin
- if BufferPointer = 1024 then
- begin
- NumRead := _lread( FileHandle , @FileDataBuffer , Sizeof( FileDataBuffer ));
- BufferPointer := 0;
- end;
- BlueValue := FileDataBuffer[ BufferPointer ];
- BufferPointer := BufferPointer + 1;
- if ( BlueValue >= 192 ) then
- begin
- Repeats := BlueValue - 192;
- if BufferPointer = 1024 then
- begin
- NumRead := _lread( FileHandle , @FileDataBuffer , Sizeof( FileDataBuffer ));
- BufferPointer := 0;
- end;
- BlueValue := FileDataBuffer[ BufferPointer ];
- BufferPointer := BufferPointer + 1;
- for i := 1 to Repeats do
- begin
- Mem[ SAddr.Hi:SAddr.Lo ] := BlueValue;
- ByteCount := ByteCount + 1;
- SAddr.Lo := StartOfs + ByteCount;
- end;
- end
- else
- begin
- Mem[ SAddr.Hi:SAddr.Lo ] := BlueValue;
- ByteCount := ByteCount + 1;
- SAddr.Lo := StartOfs + ByteCount;
- end;
- end;
- end;
-
- {---------- MDecoder256 Methods --------}
-
- procedure MDecoder256.Decode(MemoryPointer: THandle; MemorySize: longint; TheBytesPerLine: longint);
- var
- Start ,
- ToAddr ,
- Bits ,
- Source : LongType;
- ScanLine : pointer;
- LineNo ,
- i : integer;
- begin
- Bits.Ptr := GlobalLock( MemoryPointer );
- GetMem( ScanLine , TheBytesPerLine );
- if _llseek( FileHandle , 128 , 0 ) = -1 then Exit;
- Source.Ptr := ScanLine;
- for LineNo := ( Height - 1 ) downto 0 do
- begin
- Decode_Row( ScanLine );
- Start.Long := longint( LineNo ) * TheBytesPerLine;
- Source.Ptr := ScanLine;
- for i := 1 to TheBytesPerLine do
- begin
- ToAddr.Hi := Bits.Hi + ( Start.Hi * Ofs( AHIncr ));
- ToAddr.Lo := Start.Lo;
- Mem[ ToAddr.Hi:ToAddr.Lo ] := Mem[ Source.Hi:Source.Lo ];
- Source.Long := Source.Long + 1;
- Start.Long := Start.Long + 1;
- end;
- end;
- FreeMem( ScanLine , TheBytesPerLine );
- GlobalUnLock( MemoryPointer );
- end;
-
- function MDecoder256.GetBMI(var Size: word): PBitMapInfo;
- var
- BitMapInfo : PBitMapInfo;
- i : integer;
- bmiSize : word;
- PalInfo : PPCX256Palette;
- begin
- bmiSize := SizeOf( TBitmapInfoHeader ) + ( Sizeof( TRGBQuad ) * 256 );
- GetMem( BitMapInfo , bmiSize );
- BitmapInfo^.bmiHeader.biSize := Sizeof( TBitmapInfoHeader );
- BitmapInfo^.bmiHeader.biWidth := Width;
- BitmapInfo^.bmiHeader.biHeight := Height;
- BitmapInfo^.bmiHeader.biPlanes := 1;
- BitmapInfo^.bmiHeader.biBitCount := 8;
- BitmapInfo^.bmiHeader.biCompression := 0;
- BitmapInfo^.bmiHeader.biSizeImage := 0;
- BitmapInfo^.bmiHeader.biXPelsperMeter := 0;
- BitmapInfo^.bmiHeader.biYPelsperMeter := 0;
- BitmapInfo^.bmiHeader.biClrUsed := 256;
- BitmapInfo^.bmiHeader.biClrImportant := 0;
- PalInfo := PPCX256Palette( GetPaletteInfo );
- if Assigned( PalInfo ) then
- begin
- for i := 0 to 255 do
- with BitMapInfo^.bmiColors[ i ], PalInfo^[ i ] do
- begin
- rgbRed := RedValue;
- rgbGreen := GreenValue;
- rgbBlue := BlueValue;
- rgbReserved := 0;
- end;
- FreeMem( PalInfo , Sizeof( PCX256Palette ));
- end;
- Size := bmiSize;
- GetBMI := BitMapInfo;
- end;
-
- procedure MDecoder256.CreatePCXPalette( BMI : PBitMapInfo );
- var
- LogPalette : PLogPalette;
- i : integer;
- PalSize : word;
- begin
- if Palette <> 0 then
- begin
- DeleteObject( Palette );
- Palette := 0;
- end;
- PalSize := Sizeof( TLogPalette ) + ( 256 * Sizeof( TPaletteEntry )); {check this size?}
- GetMem( LogPalette , PalSize );
- for i := 0 to 255 do
- with LogPalette^ do
- begin
- palNumEntries := 256;
- palVersion := $300;
- with palPalEntry[ i ], BMI^.bmiColors[ i ] do
- begin
- peRed := rgbRed;
- peGreen := rgbGreen;
- peBlue := rgbBlue;
- peFlags := 0;
- end;
- end;
- Palette := CreatePalette( LogPalette^ );
- FreeMem( LogPalette , PalSize );
- end;
-
- function MDecoder256.GetPaletteInfo: pointer;
- var
- TempPal: PPCX256Palette;
- i: integer;
- BlueValue: byte;
- begin
- GetPaletteInfo := nil;
- if (_llseek(FileHandle, -769, 2)) = -1 then Exit;
- if ((_lread(FileHandle, @BlueValue, 1)) <> -1) then
- if BlueValue = $0C then
- begin { 256k palette exists }
- New(TempPal);
- if (_lread(FileHandle, @TempPal^, Sizeof(PCX256Palette))) = -1 then
- Dispose(TempPal)
- else
- GetPaletteInfo := TempPal;
- end;
- end;
-
- {---------- MDecoder16 Methods --------}
-
- procedure MDecoder16.Decode(MemoryPointer: THandle; MemorySize: longint; TheBytesPerLine: longint);
- var
- Start ,
- ToAddr ,
- Bits ,
- Source : LongType;
- ScanLine : pointer;
- LineNo ,
- i : integer;
- begin
- Bits.Ptr := GlobalLock( MemoryPointer );
- GetMem( ScanLine , TheBytesPerLine );
- if _llseek( FileHandle , 128 , 0 ) = -1 then Exit;
- Source.Ptr := ScanLine;
- for LineNo := ( Height - 1 ) downto 0 do
- begin
- Decode_Row( ScanLine );
- Convert_Row( TheBytesPerLine , ScanLine , ScanLine );
- Start.Long := longint( LineNo ) * TheBytesPerLine;
- Source.Ptr := ScanLine;
- for i := 1 to TheBytesPerLine do
- begin
- ToAddr.Hi := Bits.Hi + ( Start.Hi * Ofs( AHIncr ));
- ToAddr.Lo := Start.Lo;
- Mem[ ToAddr.Hi:ToAddr.Lo ] := Mem[ Source.Hi:Source.Lo ];
- Source.Long := Source.Long + 1;
- Start.Long := Start.Long + 1;
- end;
- end;
- FreeMem( ScanLine , TheBytesPerLine );
- GlobalUnLock( MemoryPointer );
- end;
-
- function MDecoder16.GetBMI(var Size: word): PBitMapInfo;
- var
- BitMapInfo : PBitMapInfo;
- i : integer;
- bmiSize : word;
- begin
- bmiSize := SizeOf( TBitmapInfoHeader ) + ( Sizeof( TRGBQuad ) * 16 );
- GetMem( BitMapInfo, bmiSize );
- BitmapInfo^.bmiHeader.biSize := Sizeof( TBitmapInfoHeader );
- BitmapInfo^.bmiHeader.biWidth := Width;
- BitmapInfo^.bmiHeader.biHeight := Height;
- BitmapInfo^.bmiHeader.biPlanes := 1;
- BitmapInfo^.bmiHeader.biBitCount := 4;
- BitmapInfo^.bmiHeader.biCompression := 0;
- BitmapInfo^.bmiHeader.biSizeImage := 0;
- BitmapInfo^.bmiHeader.biXPelsperMeter := 0;
- BitmapInfo^.bmiHeader.biYPelsperMeter := 0;
- BitmapInfo^.bmiHeader.biClrUsed := 16;
- BitmapInfo^.bmiHeader.biClrImportant := 0;
- for i := 0 to 15 do
- with BitMapInfo^.bmiColors[ i ], TheHeader^.EGAColorMap[ i ] do
- begin
- rgbRed := RedValue;
- rgbGreen := GreenValue;
- rgbBlue := BlueValue;
- rgbReserved := 0;
- end;
- Size := bmiSize;
- GetBMI := BitMapInfo;
- end;
-
- procedure MDecoder16.CreatePCXPalette( BMI : PBitMapInfo) ;
- var
- LogPalette : PLogPalette;
- i : integer;
- PalSize : word;
- begin
- if Palette <> 0 then
- begin
- DeleteObject( Palette );
- Palette := 0;
- end;
- PalSize := Sizeof( TLogPalette ) + ( 16 * Sizeof( TPaletteEntry )); {check this size?}
- GetMem( LogPalette, PalSize );
- for i := 0 to 15 do
- with LogPalette^ do
- begin
- palNumEntries := 16;
- palVersion := $300;
- with palPalEntry[ i ], BMI^.bmiColors[ i ] do
- begin
- peRed := rgbRed;
- peGreen := rgbGreen;
- peBlue := rgbBlue;
- peFlags := 0;
- end;
- end;
- Palette := CreatePalette( LogPalette^ );
- FreeMem( LogPalette , PalSize );
- end;
-
- procedure MDecoder16.Convert_Row( TheBytesPerLine: longint; TheSource : pointer; var Dest: pointer);
- var
- Nibbles : byte;
- Start ,
- ToAddr ,
- Bits ,
- Source : LongType;
- RedValue ,
- GreenValue ,
- BlueValue ,
- i ,
- j ,
- k : byte;
- begin
- Source.Ptr := TheSource;
- GetMem( Bits.Ptr, TheBytesPerLine );
- Start.Long := Bits.Long;
- for j := 1 to TheBytesPerLine do
- begin
- RedValue := Mem[ Source.Hi:Source.Lo ];
- GreenValue := Mem[ Source.Hi:Source.Lo + TheBytesPerLine ];
- BlueValue := Mem[ Source.Hi:Source.Lo + ( TheBytesPerLine * 2 ) ];
- i := Mem[ Source.Hi:Source.Lo + ( TheBytesPerLine * 3 ) ];
- for k := 0 to 3 do
- begin
- Nibbles := 0;
- if (( RedValue and $80 ) = $80 ) then Nibbles := Nibbles or $10;
- if (( GreenValue and $80 ) = $80 ) then Nibbles := Nibbles or $20;
- if (( BlueValue and $80 ) = $80 ) then Nibbles := Nibbles or $40;
- if (( i and $80 ) = $80 ) then Nibbles := Nibbles or $80;
- RedValue := RedValue shl 1; GreenValue := GreenValue shl 1; BlueValue := BlueValue shl 1; i := i shl 1;
- if (( RedValue and $80 ) = $80 ) then Nibbles := Nibbles or $01;
- if (( GreenValue and $80 ) = $80 ) then Nibbles := Nibbles or $02;
- if (( BlueValue and $80 ) = $80 ) then Nibbles := Nibbles or $04;
- if (( i and $80 ) = $80 ) then Nibbles := Nibbles or $08;
- RedValue := RedValue shl 1; GreenValue := GreenValue shl 1; BlueValue := BlueValue shl 1; i := i shl 1;
- ToAddr.Hi := Bits.Hi;
- ToAddr.Lo := Start.Lo;
- Mem[ ToAddr.Hi:ToAddr.Lo ] := Nibbles;
- Start.Long := Start.Long + 1;
- end;
- Source.Long := Source.Long + 1;
- end;
- FreeMem( TheSource, TheBytesPerLine );
- Dest := Bits.Ptr;
- end;
-
-
- end.
-